#include <iostream>
using namespace std;
//含有纯虚函数的类是抽象类不能实例化出对象
class A
{
public:
	virtual void Drive() //虚函数后加=0就是纯虚函数了，含有纯虚函数的类是抽象类，抽象类不能被继承
	{                   //final修饰虚函数不允许被重写 final修饰类该类不能被继承
		cout << "a";
	}
};
class B :public A
{
public:
	virtual void Drive() override //override检查派生类中的虚函数是否重写了基类中某虚函数，
	{                             //如果没有重写编译器会报错
		cout << "b" << endl;
	}
};

class C :public B
{
public:
	virtual void Drive() override
	{
		cout << "c" << endl;
	}
};
void func(A& a)
{
	a.Drive();
}
int main()
{
    //多态:继承+虚函数重写（覆盖）
    //普通调用：直接调用该类型的函数
    //多态调用：调用指针或者引用指向的对象的函数。指向父类调用父类的函数，指向子类调用子类的函数

    A* a = new B; //使用父类的指针或引用调用重写函数才可以形成多态！
	a->Drive(); //打印结果：b
	A* a1 = new C;
	a1->Drive(); //c
	cout << "--------" << endl;

	B().Drive(); //b
    return 0;
}


class BB
{
public:
	virtual void func3()
	{

	}
};

class CC : public AA
{
public:
	void func3()
	{

	}

	virtual void func1()
	{

	}
};

int main()
{
	//BB* bb = new CC();
	//bb->func3();
	AA* aa = new CC();
	aa->func3();
	aa->func1();//error找不到func1
    return 0;
}